package cc.rengu.oltp.service.realize;

import cc.rengu.oltp.service.common.entity.MchntOrderDetail;
import cc.rengu.oltp.service.common.entity.MchntOrderInfo;
import cc.rengu.oltp.service.common.entity.PayOrderInfo;
import cc.rengu.oltp.service.common.entity.UserOrderInfo;
import cc.rengu.oltp.service.model.OrderInfo;

import java.util.List;

/**
 * 订单服务组件
 * Created by 王成 on 2020/3/9
 */
public interface OrderService {
    /**
     * 生成用户订单号
     *
     * @return 用户订单号
     * @throws Exception 异常
     */
    String generateUserOrderId() throws Exception;

    /**
     * 登记订单信息
     *
     * @param userOrderInfo      用户订单信息
     * @param mchntOrderInfoList 商户订单信息
     * @param payOrderInfo       支付订单信息
     * @return true-成功，false-失败
     * @throws Exception 异常
     */
    boolean registerOrderInfo(UserOrderInfo userOrderInfo, List<MchntOrderInfo> mchntOrderInfoList, PayOrderInfo payOrderInfo) throws Exception;

    /**
     * 登记订单信息
     *
     * @param userOrderInfo        用户订单信息
     * @param mchntOrderInfoList   商户订单信息
     * @param mchntOrderDetailList 订单明细信息
     * @param payOrderInfo         支付订单信息
     * @return true-成功，false-失败
     * @throws Exception 异常
     */
    boolean registerOrderInfo(UserOrderInfo userOrderInfo, List<MchntOrderInfo> mchntOrderInfoList, List<MchntOrderDetail> mchntOrderDetailList, PayOrderInfo payOrderInfo) throws Exception;

    /**
     * 更新订单信息（如交易状态、业务状态以及商户手续费相关信息）
     *
     * @param userOrderInfo      用户订单信息
     * @param mchntOrderInfoList 商户订单信息
     * @param payOrderInfo       支付订单信息
     * @return true-成功，false-失败
     * @throws Exception 异常
     */
    boolean updateOrderInfo(UserOrderInfo userOrderInfo, List<MchntOrderInfo> mchntOrderInfoList, PayOrderInfo payOrderInfo) throws Exception;

    /**
     * 更新订单信息（如交易状态、业务状态以及商户手续费相关信息）
     *
     * @param userOrderInfo        用户订单信息
     * @param mchntOrderInfoList   商户订单信息
     * @param mchntOrderDetailList 订单明细信息
     * @param payOrderInfo         支付订单信息
     * @return true-成功，false-失败
     * @throws Exception 异常
     */
    boolean updateOrderInfo(UserOrderInfo userOrderInfo, List<MchntOrderInfo> mchntOrderInfoList, List<MchntOrderDetail> mchntOrderDetailList, PayOrderInfo payOrderInfo) throws Exception;

    /**
     * 更新订单信息
     *
     * @param orderInfo 订单信息
     * @return true-成功，false-失败
     * @throws Exception 异常
     */
    boolean updateOrderInfo(OrderInfo orderInfo) throws Exception;

    /**
     * 根据用户订单号及商户订单号更新用户订单及商户订单信息
     *
     * @param userOrderInfo      用户订单信息
     * @param mchntOrderInfoList 商户订单信息
     * @return true-成功，false-失败
     * @throws Exception 异常
     */
    boolean updateOrderInfo(UserOrderInfo userOrderInfo, List<MchntOrderInfo> mchntOrderInfoList) throws Exception;

    /**
     * 根据用户订单号及商户订单号更新用户订单、商户订单以及商户订单明细信息
     * @param userOrderInfo  用户订单信息
     * @param mchntOrderInfoList 商户订单信息
     * @param mchntOrderDetailList 商户订单明细信息
     * @return true-成功，false-失败
     * @throws Exception 异常
     */
    boolean updateOrderInfoByOrderId(UserOrderInfo userOrderInfo, List<MchntOrderInfo> mchntOrderInfoList, List<MchntOrderDetail> mchntOrderDetailList) throws Exception;

    /**
     * 更新订单信息（更新交易状态、业务状态，但不更新商户手续费相关字段）
     *
     * @param userOrderInfo      用户订单信息
     * @param mchntOrderInfoList 商户订单信息
     * @param payOrderInfo       支付订单信息
     * @return true-成功,false-失败
     * @throws Exception 异常
     */
    boolean updateOrderStatus(UserOrderInfo userOrderInfo, List<MchntOrderInfo> mchntOrderInfoList, PayOrderInfo payOrderInfo) throws Exception;

    /**
     * 更新订单信息（更新交易状态、业务状态，但不更新商户手续费相关字段）
     *
     * @param userOrderInfo        用户订单信息
     * @param mchntOrderInfoList   商户订单信息
     * @param mchntOrderDetailList 订单明细信息
     * @param payOrderInfo         支付订单信息
     * @return true-成功,false-失败
     * @throws Exception 异常
     */
    boolean updateOrderStatus(UserOrderInfo userOrderInfo, List<MchntOrderInfo> mchntOrderInfoList, List<MchntOrderDetail> mchntOrderDetailList, PayOrderInfo payOrderInfo) throws Exception;

    /**
     * 根据用户订单号查询创建订单信息
     *
     * @param instId      多法人标识
     * @param userOrderId 用户订单号
     * @return 订单信息
     * @throws Exception 异常
     */
    OrderInfo selectOrderInfoByUserOrderId(String instId, String userOrderId) throws Exception;

    /**
     * 根据交易流水号查询订单信息
     *
     * @param instId    多法人行标识
     * @param sysSeqNum 交易流水号
     * @return 订单信息
     * @throws Exception 异常
     */
    OrderInfo selectOrderInfoBySysSeqNum(String instId, String sysSeqNum) throws Exception;
}
